package com.example.demo.common;


import org.springframework.util.DigestUtils;

import java.util.UUID;

public class PasswordUtils {
    /**
     * 注册时使用
     * 随机生成盐值, 将密码加盐加密
     *
     * @param password  明文密码
     * @return          最终密码 (32位盐值 + $ + 32位加盐加密后的密码)
     */
    public static String encrypt(String password) {
        // 1. 生成盐值(32位), 使用 UUID 去掉 '-'
        String salt = UUID.randomUUID().toString().replace("-","");
        // 2. 将密码加盐, (密码 + 盐值), 再使用 md5 加密
        String saltPassword = DigestUtils.md5DigestAsHex((password + salt).getBytes());
        // 3. 生成最终密码, 【32位盐值 + $ + 32位加盐加密后的密码】
        return salt + '$' + saltPassword;
    }

    /**
     * 用于验证密码
     * 使用数据库中记录的盐值，生成最终密码
     *
     * @param password  明文密码
     * @param salt      盐值
     * @return          最终密码
     */
    public static String encrypt(String password, String salt) {
        // 2. 将密码加盐, (密码 + 盐值), 再使用 md5 加密
        String saltPassword = DigestUtils.md5DigestAsHex((password + salt).getBytes());
        // 2. 生成最终密码, 【32位盐值 + $ + 32位加密后的密码】
        return salt + "$" + saltPassword;
    }

    /**
     * 验证密码
     * 使用同样的加密流程， 验证用户输入的密码
     *
     * @param password          用户输入的明文密码
     * @param finalPassword     数据库中查询的最终密码
     * @return                  验证结果
     */
    public static boolean check(String password, String finalPassword) {
        // 1. 得到盐值
        String salt = finalPassword.split("\\$")[0];
        // 2. 使用明文密码， 用同样的加密流程， 进行加密
        String confirmPassword = encrypt(password, salt);
        // 3. 返回对比结果
        return finalPassword.equals(confirmPassword);
    }
}
